/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BusinessLogic;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtility {

    /* Add Day/Month/Year to a Date
    add() is used to add  values to a Calendar object.
    You specify which Calendar field is to be affected by the operation
    (Calendar.YEAR, Calendar.MONTH, Calendar.DATE).
     */
    public static final String DATE_FORMAT = "MM/dd/yyyy";

    /**
     *  Add day, get day in cal and subtract day
     * ex: 08/23/2010 - 3 = 08/20/2010
     *
     * @param  cal String query
     * @param day is array of parameters
     * @return a String is date has been subtract
     */
    public static String addToDate(Calendar cal, int day) {
        return subToDate(cal, -day);
    }

    /**
     *  Subtract day, get day in cal and subtract day
     * ex: 08/23/2010 - 3 = 08/20/2010
     *
     * @param  cal String query
     * @param day is array of parameters
     * @return a String is date has been subtract
     */
    public static String subToDate(Calendar cal, int day) {
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
        cal.add(Calendar.DATE, -day);
        return "" + sdf.format(cal.getTime());
    }

    /**
     *  get today follow System date
     *
     * @return a String is today
     */
    public static String today() {
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
        Calendar c1 = Calendar.getInstance();
        return sdf.format(c1.getTime());
    }

    /*Substract Day/Month/Year to a Date

    roll() is used to substract values to a Calendar object.
    You specify which Calendar field is to be affected by the operation
    (Calendar.YEAR, Calendar.MONTH, Calendar.DATE).

    Note: To substract, simply use a negative argument.
    roll() does the same thing except you specify if you want to roll up (add 1)
    or roll down (substract 1) to the specified Calendar field. The operation only
    affects the specified field while add() adjusts other Calendar fields.
    See the following example, roll() makes january rolls to december in the same
    year while add() substract the YEAR field for the correct result. Hence add()
    is preferred even for subtraction by using a negative element.

     */
    public static void daysBetween2Dates() {

        System.out.println("3. No of Days between 2 dates\n");
        Calendar c1 = Calendar.getInstance(); //new GregorianCalendar();
        Calendar c2 = Calendar.getInstance(); //new GregorianCalendar();
        c1.set(1999, 0, 20);
        c2.set(1999, 0, 22);
        System.out.println("Days Between " + c1.getTime() + " and " + c2.getTime() + " is");
        System.out.println((c2.getTime().getTime() - c1.getTime().getTime()) / (24 * 3600 * 1000));
        System.out.println();
        System.out.println("-------------------------------------");
    }

    public static void validateAGivenDate() {

        System.out.println("5. Validate a given date\n");
        String dt = "20011223";
        String invalidDt = "20031315";
        String dateformat = "yyyyMMdd";
        Date dt1 = null, dt2 = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(dateformat);
            sdf.setLenient(false);
            dt1 = sdf.parse(dt);
            dt2 = sdf.parse(invalidDt);
            System.out.println("Date is ok = " + dt1 + "(" + dt + ")");
        } catch (ParseException e) {
            System.out.println(e.getMessage());
        } catch (IllegalArgumentException e) {
            System.out.println("Invalid date");
        }
        System.out.println();
        System.out.println("-------------------------------------");
    }

    public static void compare2Dates() {

        System.out.println("6. Comparision of 2 dates\n");
        SimpleDateFormat fm = new SimpleDateFormat("dd-MM-yyyy");
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c1.set(2000, 02, 15);
        c2.set(2001, 02, 15);
        System.out.print(fm.format(c1.getTime()) + " is ");
        if (c1.before(c2)) {
            System.out.println("less than " + fm.format(c2.getTime()));
        } else if (c1.after(c2)) {
            System.out.println("greater than " + fm.format(c2.getTime()));
        } else if (c1.equals(c2)) {
            System.out.println("is equal to " + fm.format(c2.getTime()));
        }
        System.out.println();
        System.out.println("-------------------------------------");
    }

    public static void getDayofTheDate() {

        System.out.println("7. Get the day for a given date\n");
        Date d1 = new Date();
        String day = null;
        DateFormat f = new SimpleDateFormat("EEEE");
        try {
            day = f.format(d1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("The day for " + d1 + " is " + day);
        System.out.println();
        System.out.println("-------------------------------------");
    }

    //Utility Method to find whether an Year is a Leap year or Not
    public static boolean isLeapYear(int year) {

        if ((year % 100 != 0) || (year % 400 == 0)) {
            return true;
        }
        return false;
    }

}
